home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 4
/
Info_Mac IV CD-ROM (Pacific HiTech Inc.)(August 1994).iso
/
Configuration
/
TE3Click 1.0 folder
/
Source Code
/
TE3Click patch.c
< prev
Wrap
C/C++ Source or Header
|
1994-03-08
|
3KB
|
106 lines
/*
* TE3CLICK PROJECT
* PATCH CODE
*
* Copyright © 1994 Marco Piovanelli
* All Rights Reserved
*/
/* low-memory globals */
extern long DoubleTime : 0x2F0;
extern void * TEFindWord : 0x7F8;
void main(void)
{
asm {
bra.s @entry ; entry point
@daisy dc.l 0x00000000 ; original address
/*
* This is a version of TEClick that allows triple clicks to select lines.
* Basically, it works by temporarily replacing the global hook TEFindWord
* just before calling TEClick.
*
* pascal void TEClick(Point pt, Boolean extend, TEHandle hTE)
*/
@entry link a6, #0 ;
movem.l d7/a3-a4, -(sp) ;
movea.l 8(a6), a3 ; a3 = handle to TextEdit record
movea.l (a3), a4 ; a4 = ptr to TextEdit record
clr.b d7 ;
move.w 32(a4), d0 ;
cmp.w 34(a4), d0 ; empty selection range?
beq @1 ;
clr.l -(sp) ;
_TickCount ;
move.l 46(a4), d0 ; get clickTime
add.l DoubleTime, d0 ; d0 = clickTime + doubleTime
cmp.l (sp)+, d0 ; sufficiently close in time to previous click?
ble @1 ;
move.w 50(a4), -(sp) ; get clickLoc (text offset of previous click)
clr.w -(sp) ; reserve space for function result
move.l 14(a6), -(sp) ; push pt
move.l a3, -(sp) ; push hTE
_TEGetOffset ;
move.w (sp)+, d0 ; d0 = current text offset
cmp.w (sp)+, d0 ; compare with text offset of previous click
seq d7 ;
@1 tst.b d7 ;
beq.s @2 ;
move.l TEFindWord, -(sp) ; save TEFindWord
lea @findline, a0 ;
move.l a0, TEFindWord ; store our own routine
@2 move.l 14(a6), -(sp) ; push pt
move.b 12(a6), -(sp) ; push extend
move.l a3, -(sp) ; push hTE
move.l @daisy, a0 ;
jsr (a0) ; call original _TEClick
tst.b d7 ;
beq.s @3 ;
move.l (sp)+, TEFindWord ; restore TEFindWord
@3 movem.l (sp)+, d7/a3-a4 ;
unlk a6 ;
move.l (sp)+, a0 ; pop return address
lea 10(sp), sp ; clean up stack
jmp (a0) ; return to caller
@findline movem.l a4/d4-d7, -(sp) ;
move.w d0, d4 ; d4 = text offset
cmp.w 60(a3), d4 ; offset >= pTE->teLength?
bge.s @5 ;
moveq #0, d7 ; d7 = minIndex = 0
move.w 94(a3), d6 ; d6 = maxIndex = pTE->nLines
@loop move.w d7, d5 ;
add.w d6, d5 ;
asr.w #1, d5 ; d5 = index = (minIndex + maxIndex) / 2
movea.w d5, a4 ;
adda.w a4, a4 ;
adda.l a3, a4 ;
move.w 96(a4), d0 ; d0 = pTE->lineStarts[index]
cmp.w d4, d0 ;
bgt.s @4 ;
addq.w #1, d5 ;
movea.w d5, a4 ;
adda.w a4, a4 ;
adda.l a3, a4 ;
move.w 96(a4), d1 ; d1 = pTE->lineStarts[++index]
cmp.w d4, d1 ;
bgt.s @found ; line found
move.w d5, d7 ; minIndex = index
bra.s @loop ;
@4 move.w d5, d6 ; maxIndex = index
bra.s @loop ;
@5 move.w d0, d1 ;
@found movem.l (sp)+, a4/d4-d7 ;
; implicit rts
}
}